#define xuser mixc::powerful_cat
#include"lang/cxx/make_uri.hpp"
#include"lang/cxx.hpp"
#include"mixc.hpp"
#include"utils/array.hpp"

xinit(xuser::the_main){
    using namespace xuser;

    // 注意：
    // 每次返回的地址是一样的，所以是新值覆盖旧值的逻辑
    // 所以是新值覆盖旧值的逻辑
    enum { max_buffer = 128 };
    char buf[max_buffer];
    auto alloc = [&](uxx length) -> char * {
        if (length >= max_buffer){
            return nullptr; // 返回 null 并不会导致异常，只是会终止分配后续的操作，如果没有特殊要求，则会生成空串
        }
        else{
            buf[length] = '\0'; // \0 终结符不是必须的，如果你想和 cstr 兼容，可以这么做
            return buf;
        }
    };

    // make_uri 只会对非 ascii 字符进行编码，它转换成 utf-8 类型，所以 const char * 和 const char16_t * 结果是一样的
    u08 s1234[4] = { '1', '2', '3', '4' };
    xhint(c08(make_uri, s1234, alloc));
    xhint(c08(make_uri, "1", alloc));
    xhint(c08(make_uri,  "我的1024世界", alloc));
    xhint(c08(make_uri, u"我的1024世界", alloc));
    xhint(c08(make_uri, "100%", alloc));
    xhint(c08(make_uri, "我是可爱的喵酱~", alloc));
    xhint(c08(make_uri, "250", alloc));
    xhint(c08(make_uri, "happy every day", alloc));
    xhint(c08(make_uri, "hello world", alloc));
    xhint(c08(make_uri, make_array('h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'), alloc));
};
